home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 August: Tool Chest / Dev.CD Aug 00 TC Disk 1.toast / pc / sample code / contributed / spriteworld / examples / spritetest / about.c next >
Encoding:
Text File  |  2000-06-23  |  7.0 KB  |  304 lines

  1. ///--------------------------------------------------------------------------------------
  2. //    About.c
  3. //
  4. //    By:        Tony Myles
  5. //
  6. //    Copyright: © 1993-94 Tony Myles, All rights reserved worldwide.
  7. ///--------------------------------------------------------------------------------------
  8.  
  9.  
  10. #ifndef __RESOURCES__
  11. #include <Resources.h>
  12. #endif
  13.  
  14. #ifndef __SPRITEWORLD__
  15. #include "SpriteWorld.h"
  16. #endif
  17.  
  18. #ifndef __SPRITELAYER__
  19. #include "SpriteLayer.h"
  20. #endif
  21.  
  22. #ifndef __SPRITE__
  23. #include "Sprite.h"
  24. #endif
  25.  
  26. #ifndef __FRAME__
  27. #include "Frame.h"
  28. #endif
  29.  
  30. #ifndef __SPRITEWORLDUTILS__
  31. #include "SpriteWorldUtils.h"
  32. #endif
  33.  
  34. #ifndef __DIALOGUTILS__
  35. #include "DialogUtils.h"
  36. #endif
  37.  
  38. #ifndef __SPRITETEST__
  39. #include "SpriteTest.h"
  40. #endif
  41.  
  42. #ifndef __APPLICATION__
  43. #include "Application.h"
  44. #endif
  45.  
  46. #ifndef __ABOUT__
  47. #include "About.h"
  48. #endif
  49.  
  50.  
  51. extern SpriteTestPtr gSpriteTestP;
  52.  
  53.  
  54.  
  55. ///--------------------------------------------------------------------------------------
  56. // DisplayAboutBox
  57. ///--------------------------------------------------------------------------------------
  58.  
  59. void DisplayAboutBox(void)
  60. {
  61.     OSErr err;
  62.     GrafPtr savePort;
  63.     DialogPtr aboutDialogP;
  64.     SpriteWorldPtr spriteWorldP = NULL;
  65.     SpriteLayerPtr spriteLayerP = NULL;
  66.     SpritePtr earthSpriteP = NULL, shadowSpriteP = NULL;
  67.     Rect itemRect, moveBoundsRect;
  68.     short itemHit;
  69. #if SW_PPC
  70.     ModalFilterUPP spriteWorldDialogFilter;
  71. #else
  72.     ModalFilterProcPtr spriteWorldDialogFilter;
  73. #endif
  74.  
  75.     aboutDialogP = GetNewDialog(kAboutDialogID, NULL, (WindowPtr)-1L);
  76.     
  77.     if (aboutDialogP != NULL)
  78.     {
  79.         GetPort(&savePort);
  80.         SetPort(aboutDialogP);
  81.  
  82.             // create the sprite world
  83.         err = SWCreateSpriteWorldFromWindow(&spriteWorldP, (CWindowPtr)aboutDialogP, NULL);
  84.     
  85.         if (err == noErr)
  86.         {    
  87.                 // create the sprite layer
  88.             err = SWCreateSpriteLayer(&spriteLayerP);
  89.         }
  90.  
  91.         if (err == noErr)
  92.         {
  93.             err = SWCreateSpriteFromCIconResource(&earthSpriteP, NULL, kEarthCIconID, 1, kRegionMask);
  94.         }
  95.  
  96.         if (err == noErr)
  97.         {
  98.             err = SWCreateSpriteFromCIconResource(&shadowSpriteP, NULL, kShadowCIconID,
  99.                                                             kNumberOfShadowFrames, kRegionMask);
  100.         }
  101.  
  102.         if (err == noErr)
  103.         {
  104.             shadowSpriteP->userData = (long)earthSpriteP;
  105.  
  106.             SWAddSprite(spriteLayerP, shadowSpriteP);
  107.             SWAddSprite(spriteLayerP, earthSpriteP);
  108.             SWAddSpriteLayer(spriteWorldP, spriteLayerP);
  109.  
  110.             GetDItemRect(aboutDialogP, 4, &itemRect);
  111.             moveBoundsRect = aboutDialogP->portRect;
  112.             moveBoundsRect.bottom = itemRect.top - (kMaxSpeed / 2);
  113.  
  114.                 // set the sprite’s movement characteristics
  115.             SWSetSpriteMoveBounds(earthSpriteP, &moveBoundsRect);
  116.             SWSetSpriteMoveDelta(earthSpriteP, 0, kInitialSpeed);
  117.             SWSetSpriteMoveProc(earthSpriteP, EarthMoveProc);
  118.             SWSetSpriteMoveTime(earthSpriteP, 55);
  119.             SWSetSpriteMoveTime(shadowSpriteP, -1);        // never move
  120.             SWSetSpriteFrameTime(shadowSpriteP, 0);
  121.             SWSetSpriteFrameRange(shadowSpriteP, 0, 2);
  122.             SWSetSpriteFrameProc(shadowSpriteP, ShadowFrameProc);
  123.             SWSetCurrentFrameIndex(shadowSpriteP, 2);
  124.             SWSetSpriteMoveBounds(shadowSpriteP, &moveBoundsRect);
  125.  
  126.                 // set the sprite’s initial location
  127.             SWSetSpriteLocation(shadowSpriteP, itemRect.left, itemRect.top);
  128.             GetDItemRect(aboutDialogP, 5, &itemRect);
  129.             SWSetSpriteLocation(earthSpriteP, itemRect.left, itemRect.top);
  130.  
  131.             ((WindowPeek)aboutDialogP)->refCon = (long)spriteWorldP;
  132.  
  133.             ShowWindow(aboutDialogP);
  134.             SetPort(aboutDialogP);
  135.             DrawDialog(aboutDialogP);
  136.             EraseRect(&itemRect);
  137.             OutlineDefaultButton(aboutDialogP, ok);
  138.             ValidRect(&aboutDialogP->portRect);
  139.  
  140.             SWLockSpriteWorld(spriteWorldP);
  141.  
  142.             CopyBits(&aboutDialogP->portBits,
  143.                         spriteWorldP->backFrameP->framePix.bitMapP,
  144.                         &aboutDialogP->portRect,
  145.                         &aboutDialogP->portRect,
  146.                         srcCopy, NULL);
  147.  
  148.  
  149.             spriteWorldDialogFilter = NewModalFilterProc(AboutDialogFilter);
  150.  
  151.             do
  152.             {
  153.                 ModalDialog(spriteWorldDialogFilter, &itemHit);
  154.             } while (itemHit != ok);
  155.  
  156. #if SW_PPC
  157.             DisposeRoutineDescriptor(spriteWorldDialogFilter);
  158. #endif
  159.  
  160.             SWUnlockSpriteWorld(spriteWorldP);
  161.         }
  162.  
  163.         DisposeDialog(aboutDialogP);
  164.  
  165.         if (earthSpriteP != NULL)
  166.             SWDisposeSprite(earthSpriteP);
  167.  
  168.         if (shadowSpriteP != NULL)
  169.             SWDisposeSprite(shadowSpriteP);
  170.  
  171.         if (spriteLayerP != NULL)
  172.             SWDisposeSpriteLayer(spriteLayerP);
  173.  
  174.         if (spriteWorldP != NULL)
  175.             SWDisposeSpriteWorld(spriteWorldP);
  176.  
  177.         SetPort(savePort);
  178.  
  179.         if (err != noErr)
  180.         {
  181.             ErrorAlert(err, kUnknownErrorStringIndex);
  182.         }
  183.     }
  184.     else
  185.     {
  186.         ErrorAlert(ResError(), kCantFindResourceStringIndex);
  187.     }
  188. }
  189.  
  190.  
  191. ///--------------------------------------------------------------------------------------
  192. // EarthMoveProc
  193. ///--------------------------------------------------------------------------------------
  194.  
  195. SW_FUNC void EarthMoveProc(
  196.     SpritePtr srcSpriteP,
  197.     Point* spritePoint)
  198. {
  199.         // gravity
  200.     if (srcSpriteP->vertMoveDelta < (short)kMaxSpeed)
  201.         srcSpriteP->vertMoveDelta++;
  202.  
  203.         // bounce
  204.     if (srcSpriteP->destFrameRect.bottom > srcSpriteP->moveBoundsRect.bottom)
  205.     {
  206.         srcSpriteP->vertMoveDelta = -srcSpriteP->vertMoveDelta;
  207.         
  208.         spritePoint->v = srcSpriteP->moveBoundsRect.bottom -
  209.             (srcSpriteP->curFrameP->frameRect.bottom - srcSpriteP->curFrameP->frameRect.top);
  210.     }
  211. }
  212.  
  213.  
  214. ///--------------------------------------------------------------------------------------
  215. // ShadowFrameProc
  216. ///--------------------------------------------------------------------------------------
  217.  
  218. SW_FUNC void ShadowFrameProc(
  219.     SpritePtr srcSpriteP,
  220.     FramePtr curFrameP,
  221.     long* curFrameIndex)
  222. {
  223. #if MPW
  224. #pragma unused(curFrameP)
  225. #endif
  226.  
  227.     SpritePtr earthSpriteP = (SpritePtr)srcSpriteP->userData;
  228.     short distanceFromTop = earthSpriteP->destFrameRect.top - srcSpriteP->moveBoundsRect.top;
  229.     short height = srcSpriteP->moveBoundsRect.bottom - srcSpriteP->moveBoundsRect.top;
  230.  
  231.     *curFrameIndex = (long)((distanceFromTop * 3) / height);
  232.  
  233.         // lets not index past the last frame!
  234.         // (even though SpriteWorld will not allow it to happen)
  235.     if (*curFrameIndex > 2L) *curFrameIndex = 2L;
  236. }
  237.  
  238.  
  239. ///--------------------------------------------------------------------------------------
  240. // AboutDialogFilter
  241. ///--------------------------------------------------------------------------------------
  242.  
  243. pascal Boolean AboutDialogFilter(
  244.     DialogPtr aboutDialogP,
  245.     EventRecord *event,
  246.     short *itemHit)
  247. {
  248.     Boolean eventHandled = false;
  249.     SpriteWorldPtr spriteWorldP = (SpriteWorldPtr)((WindowPeek)aboutDialogP)->refCon;
  250.  
  251.     switch (event->what)
  252.     {
  253.         case nullEvent:
  254.         {
  255.                 // run the about box animation
  256.             SWProcessSpriteWorld(spriteWorldP);
  257.             SWAnimateSpriteWorld(spriteWorldP);
  258.  
  259.                 // keep the title animation going!
  260.             RunSpriteTest(gSpriteTestP);
  261.             break;
  262.         }
  263.  
  264.         case keyDown:
  265.         case autoKey:
  266.         {
  267.             char key = (char)(event->message & charCodeMask);
  268.  
  269.             if (key == kReturnChar || (key == kEnterChar))
  270.             {
  271.                 *itemHit = ok;
  272.                 eventHandled = true;
  273.                 ClickDialogButton(aboutDialogP, ok);
  274.             }
  275.  
  276.             break;
  277.         }
  278.  
  279.         case updateEvt:
  280.         {
  281.             if ((DialogPtr)event->message == aboutDialogP)
  282.             {
  283.                 SetPort(aboutDialogP);
  284.                 BeginUpdate(aboutDialogP);
  285.  
  286.                 SWUpdateSpriteWorld(spriteWorldP);
  287.                 
  288.                 EndUpdate(aboutDialogP);
  289.                 eventHandled = true;
  290.             }
  291.             else
  292.             {
  293.                 HandleUpdateEvent((WindowPtr)event->message);
  294.             }
  295.  
  296.             break;
  297.         }
  298.     }
  299.  
  300.     return eventHandled;
  301. }
  302.  
  303.  
  304.